from parsel import Selector

"""
除了常用的 css 和 xpath 方法，Selector 对象还提供了正则表达式提取方法 re、 re_first
re 对应多个结果，re_first 对应单个结果，可以在不同情况下选择对应的方法进行提取
"""
html = '''
<div>
    <ul>
         <li class="item-0">first item</li>
         <li class="item-1"><a href="link2.html">second item</a></li>
         <li class="item-0 active"><a href="link3.html"><span class="bold">third item</span></a></li>
         <li class="item-1 active"><a href="link4.html">fourth item</a></li>
         <li class="item-0"><a href="link5.html">fifth item</a></li>
     </ul>
 </div>
'''

"""
 示例1 通过正则提取内容
 re 方法在这里遍历了所有提取到的 Selector 对象，然后根据传入的正则表达式查找出符合规则的节点源码并以列表的形式返回
"""
selector = Selector(text=html)
# 先定位到li节点，然后对于整个<li></li>代码，进行正则匹配
result = selector.css('.item-0').re('link.*')
print(result) # ['link3.html"><span class="bold">third item</span></a></li>', 'link5.html">fifth item</a></li>']

"""
  示例2 re方法是对上一步操作取值的，进一步提取
  如果在调用 css 方法时已经提取了进一步的结果，比如提取了节点文本值，那么 re 方法就只会针对节点文本值进行提取
"""
selector = Selector(text=html)
result = selector.css('.item-0 *::text').re('.*item')
print(result) # ['first item', 'third item', 'fifth item']


"""
 示例3 re_first 方法来提取第一个符合规则的结果
"""
selector = Selector(text=html)
result = selector.css('.item-0').re_first('<span class="bold">(.*?)</span>')
print(result) # third item